package com.song.workpool.control;

import java.util.LinkedList;
import java.util.Timer;
import java.util.TimerTask;

import com.song.email.util.common.Config;

public abstract class AbstractTaskControl<T> {
	private int saveTime = 30; // 定时执行（频率）单位s
	protected LinkedList<T> objDatas = new LinkedList<T>();
	private long lastTaskTime = 0;
	
	public void init(int saveTime) {
		this.saveTime = saveTime;
		startSaveRecordTimer();
	}
	
	/** 添加数据到队列，若队列已经大于最大数量，则执行任务操作 */
	public synchronized void addObjectData(T data) {
		if (Config.isStart != 1) {
			return;
		}
		this.objDatas.addLast(data);
		executeTask();
	}
	
	/** 定时器，定时检查是否要发送 */
	private void startSaveRecordTimer() {
		Timer saveTimer = new Timer();
		saveTimer.schedule(new TimerTask() {
			public void run() {
				timeCheckTask();
			}
		}, saveTime * 1000, saveTime * 1000);
	}
	
	/** 检查是否需要执行任务 */
	private synchronized void timeCheckTask() {
		if (this.objDatas.size() == 0) { // 无数据则不执行
			return;
		}
		// 若上次执行入库时间距离现在小于保存时间则不执行
		if (System.currentTimeMillis() - lastTaskTime < saveTime * 1000) {
			return;
		}
		executeTask();
		// 记录最后一次执行任务的时间
		lastTaskTime = System.currentTimeMillis();
		this.objDatas.clear();
	}

	/** 从队列中读取全部需要执行的任务，放入具体任务实现，将任务推入任务线程池 */
	protected abstract void executeTask();
	
}
